package com.rlj.messagequeue.mqserver.datacenter;

import com.rlj.messagequeue.MessageQueueApplication;
import com.rlj.messagequeue.mqserver.core.Binding;
import com.rlj.messagequeue.mqserver.core.Exchange;
import com.rlj.messagequeue.mqserver.core.ExchangeType;
import com.rlj.messagequeue.mqserver.core.MSGQueue;
import com.rlj.messagequeue.mqserver.mapper.MetaMapper;

import java.io.File;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description: 数据库操作类
 * User: DELL
 * Date: 2024-02-24
 * Time: 23:33
 */
public class DataBaseManager {

    // 这里不进行自动装入，因为当前类没有注入到 spring 容器中
    private MetaMapper metaMapper;

    /**
     * 数据库表的初始化
     */
    public void init() {
        // 使用 context 进行手动拿到容器中注入的类
        metaMapper = MessageQueueApplication.context.getBean(MetaMapper.class);

        // 检验本机是否已创建过数据库
        if (!checkDatabaseExist()) {
            // 创建 ./data 目录
            File file = new File("./data");
            file.mkdirs();
            // 创建数据库表
            createTables();
            // 初始化默认数据
            insertDefaultData();

            System.out.println("[DataBaseManager] 数据库初始化完成");
        } else {
            System.out.println("[DataBaseManager] 已经初始化过,不需要重新初始化");
        }
    }

    /**
     * 删除数据库
     * 该方法主要提供给测试类
     */
    public void deleteDB() {
        File file = new File("./data/meta.db");
        boolean ret = file.delete();
        if (ret) {
            System.out.println("[DataBaseManager] 删除数据库成功");
        } else {
            System.out.println("[DataBaseManager] 删除数据库失败");
        }

        // 删除 ./data 目录
        file = new File("./data");
        ret = file.delete();
        if (ret) {
            System.out.println("[DataBaseManager] 删除数据库目录成功");
        } else {
            System.out.println("[DataBaseManager] 删除数据库目录失败");
        }
    }

    /**
     * 检查本机是否已经初始化过数据库
     * 由于我们对于 sqlite 的配置为 url: jdbc:sqlite:./data/meta.db
     * 因此只需要检查是否存在 ./data/meta.db 文件即可
     *
     * @return
     */
    private boolean checkDatabaseExist() {
        File file = new File("./data/meta.db");
        return file.exists();
    }

    /**
     * 创建数据库表
     * 这里不需要手动创建 ./data/meta.db 文件，MyBatis
     * 会在第一次建表的时候自动创建
     */
    private void createTables() {
        metaMapper.createExchangeTable();
        metaMapper.createQueueTable();
        metaMapper.createBindingTable();

        System.out.println("[DataBaseManager] 数据库建表完成");
    }

    /**
     * 插入默认数据 （模仿RabbitMQ）
     * 默认创建一个匿名的交换机,类型为 DIRECT,方便用户使用
     */
    private void insertDefaultData() {
        Exchange exchange = new Exchange();
        exchange.setName("");
        exchange.setType(ExchangeType.DIRECT);
        exchange.setDurable(true);
        exchange.setAutoDelete(false);
        metaMapper.insertExchange(exchange);

        System.out.println("[DataBaseManager] 初始化默认数据完成");
    }

    public void insertExchange(Exchange exchange) {
        metaMapper.insertExchange(exchange);
    }

    public void deleteExchange(String name) {
        metaMapper.deleteExchange(name);
    }

    public List<Exchange> selectAllExchanges() {
        return metaMapper.selectAllExchanges();
    }

    public void insertQueue(MSGQueue queue) {
        metaMapper.insertQueue(queue);
    }

    public void deleteQueue(String name) {
        metaMapper.deleteQueue(name);
    }

    public List<MSGQueue> selectAllQueues() {
        return metaMapper.selectAllQueues();
    }

    public void insertBinding(Binding binding) {
        metaMapper.insertBinding(binding);
    }

    public void deleteBinding(Binding binding) {
        metaMapper.deleteBinding(binding);
    }

    public List<Binding> selectAllBindings() {
        return metaMapper.selectAllBindings();
    }
}
